#!/bin/bash

# Vue Admin System 项目初始化脚本
# 用于快速搭建开发环境

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查命令是否存在
check_command() {
    if ! command -v $1 &> /dev/null; then
        log_error "$1 未安装，请先安装 $1"
        exit 1
    fi
}

# 检查 Node.js 版本
check_node_version() {
    local required_version="18"
    local current_version=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
    
    if [ "$current_version" -lt "$required_version" ]; then
        log_error "Node.js 版本过低，当前版本: $(node -v)，要求版本: >= v${required_version}.0.0"
        exit 1
    fi
    
    log_success "Node.js 版本检查通过: $(node -v)"
}

# 安装依赖
install_dependencies() {
    local project_path=$1
    local project_name=$2
    
    log_info "正在安装 ${project_name} 依赖..."
    
    cd "$project_path"
    
    if [ -f "package-lock.json" ]; then
        npm ci
    else
        npm install
    fi
    
    log_success "${project_name} 依赖安装完成"
}

# 创建环境配置文件
create_env_file() {
    local backend_path="$1/apps/backend"
    
    if [ ! -f "$backend_path/.env" ]; then
        log_info "创建后端环境配置文件..."
        
        cat > "$backend_path/.env" << EOF
# 数据库配置
DB_TYPE=sqlite
DB_DATABASE=./database.sqlite

# JWT 配置
JWT_SECRET=development-secret-key-$(date +%s)
JWT_EXPIRES_IN=7d

# 应用配置
PORT=3000
NODE_ENV=development

# 日志配置
LOG_LEVEL=debug
EOF
        
        log_success "环境配置文件创建完成"
    else
        log_warning "环境配置文件已存在，跳过创建"
    fi
}

# 初始化数据库
init_database() {
    local backend_path="$1/apps/backend"
    
    log_info "初始化数据库..."
    
    cd "$backend_path"
    
    # 如果有数据库迁移脚本，运行它
    if npm run --silent 2>/dev/null | grep -q "migration:run"; then
        npm run migration:run
        log_success "数据库迁移完成"
    fi
    
    # 如果有种子数据脚本，运行它
    if npm run --silent 2>/dev/null | grep -q "seed:run"; then
        npm run seed:run
        log_success "种子数据初始化完成"
    fi
}

# 运行测试
run_tests() {
    local project_path=$1
    local project_name=$2
    
    log_info "运行 ${project_name} 测试..."
    
    cd "$project_path"
    
    if npm run --silent 2>/dev/null | grep -q "test"; then
        npm run test
        log_success "${project_name} 测试通过"
    else
        log_warning "${project_name} 没有配置测试脚本"
    fi
}

# 主函数
main() {
    local project_root=$(pwd)
    
    log_info "开始初始化 Vue Admin System 项目..."
    
    # 检查必要的命令
    log_info "检查系统环境..."
    check_command "node"
    check_command "npm"
    check_command "git"
    
    # 检查 Node.js 版本
    check_node_version
    
    # 检查项目结构
    if [ ! -d "apps/frontend" ] || [ ! -d "apps/backend" ]; then
        log_error "项目结构不正确，请确保在项目根目录运行此脚本"
        exit 1
    fi
    
    # 安装前端依赖
    install_dependencies "$project_root/apps/frontend" "前端"
    
    # 安装后端依赖
    install_dependencies "$project_root/apps/backend" "后端"
    
    # 创建环境配置文件
    create_env_file "$project_root"
    
    # 初始化数据库
    init_database "$project_root"
    
    # 运行测试（可选）
    if [ "$1" = "--with-tests" ]; then
        run_tests "$project_root/apps/frontend" "前端"
        run_tests "$project_root/apps/backend" "后端"
    fi
    
    # 显示完成信息
    echo
    log_success "项目初始化完成！"
    echo
    echo -e "${BLUE}接下来的步骤：${NC}"
    echo "1. 启动后端服务："
    echo "   cd apps/backend && npm run start:dev"
    echo
    echo "2. 启动前端服务（新开终端）："
    echo "   cd apps/frontend && npm run dev"
    echo
    echo "3. 访问应用："
    echo "   前端: http://localhost:5173"
    echo "   后端 API: http://localhost:3000/api"
    echo "   API 文档: http://localhost:3000/api/docs"
    echo
    echo "4. 默认登录账户："
    echo "   用户名: admin"
    echo "   密码: admin123"
    echo
    echo -e "${GREEN}祝您开发愉快！${NC}"
}

# 显示帮助信息
show_help() {
    echo "Vue Admin System 项目初始化脚本"
    echo
    echo "用法:"
    echo "  $0 [选项]"
    echo
    echo "选项:"
    echo "  --with-tests    运行测试"
    echo "  --help         显示此帮助信息"
    echo
    echo "示例:"
    echo "  $0                # 基本初始化"
    echo "  $0 --with-tests   # 初始化并运行测试"
}

# 处理命令行参数
case "$1" in
    --help)
        show_help
        exit 0
        ;;
    --with-tests)
        main --with-tests
        ;;
    "")
        main
        ;;
    *)
        log_error "未知选项: $1"
        show_help
        exit 1
        ;;
esac